package com.common.data.desensitization.common.annotation;

import com.common.data.desensitization.common.enums.DesensitizationStrategyEnum;
import com.common.data.desensitization.common.handler.DesensitizationHandler;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @ClassName DesensitizationServiceUtil
 * @Description 脱敏规则注解
 * @Author shiyuan
 * @Date 2025/5/18 12:30
 * @Version 1.0
 **/
@Retention(RetentionPolicy.RUNTIME)
@Target({}) // 这个注解不直接用在字段或方法上，而是作为 @Desensitize 的一部分,子注解
public @interface DesensitizationRule {
    /**
     * JsonPath 表达式，用于定位需要脱敏的字段。
     * 例如: "$.name", "$.data.userInfo.phone", "$.items[*].email"
     * 对于 "精准到某一条数据"，可以使用 JsonPath 的过滤表达式:
     * "$.users[?(@.id == 'targetUserId')].phoneNumber"
     * "$.orders[?(@.orderNo == #orderNoParam)].customer.address" (高级用法，结合 SpEL 从方法参数取值，此处简化，假定值为字面量)
     */
    String jsonPath();

    /**
     * 脱敏策略
     */
    DesensitizationStrategyEnum strategy() default DesensitizationStrategyEnum.MIDDLE_MASK;

    /**
     * 掩码字符，默认为 '*'
     */
    char maskChar() default '*';

    // --- 策略参数 ---

    /**
     * 对于 PREFIX_KEEP 和 MIDDLE_MASK: 保留前缀的长度
     */
    int prefixKeep() default 0;

    /**
     * 对于 SUFFIX_KEEP 和 MIDDLE_MASK: 保留后缀的长度
     */
    int suffixKeep() default 0;

    /**
     * 对于 MIDDLE_MASK: 中间替换的固定字符串 (如果为空，则根据前后缀和总长度计算掩码数量)
     * 如果不为空，则 prefixKeep 和 suffixKeep 定义了截取原字符串的前后缀，中间用此字符串替换
     */
    String middleReplaceString() default "";


    /**
     * 对于 REGEX_REPLACE: 自定义正则表达式
     */
    String regex() default "";

    /**
     * 对于 REGEX_REPLACE: 替换表达式 (例如 "$1****$2")
     */
    String replacement() default "$1****$2"; // 默认替换捕获组之间的内容

    /**
     * 对于 CUSTOM_HANDLER: 自定义脱敏处理器类
     */
    Class<? extends DesensitizationHandler> customHandler() default DesensitizationHandler.class;

    /**
     * 条件 JsonPath: 指向一个字段，用于判断是否执行此脱敏规则
     * 例如: "$.userType"
     * 如果此路径的值等于 conditionValue，则此规则生效
     * 如果为空，则此规则总是尝试生效
     *
     * 条件脱敏
     */
    String conditionJsonPath() default "";

    /**
     * 条件值: 与 conditionJsonPath 指向的字段的值进行比较
     * 例如: "VIP"
     */
    String conditionValue() default "";

    /**
     * 条件匹配策略:
     * ANY: 匹配 conditionJsonPath 指定的字段的任意一个值
     * ALL: 匹配 conditionJsonPath 指定的字段的所有值
     */
    ConditionMatchStrategy conditionMatchStrategy() default ConditionMatchStrategy.ANY;
}
